from django.shortcuts import render

# Create your views here.
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from libs.captcha.captcha import captcha
from django_redis import get_redis_connection
from django.http import HttpResponse
from . import constants


class RegisterImageCodeView(APIView):
    """
   GET     /verifications/imagecodes/(?P<image_code_id>.+)/
   img标签会发送一个get请求,来获取图片资源
   我们需要让前端提供一个 image_code_id 方便我们记录验证码,为以后验证 图片验证码提供帮助
   我们需要将生成的图片验证码信息保存在redis中

   1.前端需要提供给我一个 确保图片验证码唯一的标示
   # 2. 通过 captcha生成图片和验证码
   # 3. 我们需要将验证码保存在redis中
   """

    def get(self, request, image_code_id):
        """
        通过第三方库,生成图片和验证码,我们需要对验证码进行redis保存
        思路为:
        创建图片和验证码
        通过redis进行保存验证码,需要在设置中添加 验证码数据库选项
        将图片返回
        """

        # 创建图片和验证码

        text, image = captcha.generate_captcha()
        print('我是图片验证码',text)
        # 通过redis进行保存/  连接redis
        redis_conn = get_redis_connection('code')
        # 设置数据
        # redis_conn.setex('img_%s' % image_code_id, 60, text)
        redis_conn.setex('img_%s' % image_code_id, constants.IMAGE_CODE_EXPIRE, text)
        # 将图片返回
        # 注意：  图片是二进制，需要通过httpresponse返回
        return HttpResponse(image, content_type='image/jpeg')


from rest_framework.generics import GenericAPIView
from libs.yuntongxun.sms import CCP
from .serializers import RegisterSmscodeSerializer


class RegisterSmscodeViews(APIView):
    def get(self, request, mobile):
        # 2. 对图片验证码和uuid进行效验，手机号码也需要效验
        # 我们需要对数据进行  验证（反序列话）
        # /？P<mobile>1[3-9]\d{9}/?text=xxx&image_code_id=xxx
        # 我们要获取get中的查询字符串的时候 需要使用 Request 中的 query_params
        data = request.query_params
        serializer = RegisterSmscodeSerializer(data=data)

        # 验证
        serializer.is_valid()
        # 3.需要对手机号发送记录进行判断（60秒内是否发送过）
        redis_coon = get_redis_connection('code')
        # 获取发送的状态
        if redis_coon.get('sms_flag_%s' % mobile):
            return Response(status=status.HTTP_429_TOO_MANY_REQUESTS)
        # 4.生成短信
        from random import randint
        sms_code = '%06d' % randint(0, 999999)
        print(sms_code)
        # 5.redis记录短信内容

        # 记录为string
        redis_coon.setex('sms_%s' % mobile, 5 * 60, sms_code)
        # 记录发送状态
        redis_coon.setex('sms_flag_%s' % mobile, 60, 1)
        # 6.发送短信
        ccp = CCP()
        ccp.send_template_sms(mobile, [sms_code, 5], 1)
        from celery_tasks.sms.tasks import send_sms_code

        # 注意： 异步任务必须使用 delay调用
        # delay的参数是和任务的参数是一致的
        # send_sms_code(mobile,sms_code)  # ---错误代码，不能这样发送
        send_sms_code.delay(mobile, sms_code)
        return Response({'message': 'ok'})
